      1  import java.io.IOException;

      2  import java.sql.SQLException;

      3

      4  /**

      5     An ATM that accesses a bank.

      6  */

      7  public class ATM

      8  {

      9     public static final int CHECKING = 1;

     10     public static final int SAVINGS = 2;

     11

     12     private int state;

     13     private int customerNumber;

     14     private Customer currentCustomer;

     15     private BankAccount currentAccount;

     16     private Bank theBank;

     17

     18     public static final int START = 1;

     19     public static final int PIN = 2;

     20     public static final int ACCOUNT = 3;

     21     public static final int TRANSACT = 4;

     22

     23     /**

     24        Constructs an ATM for a given bank.

     25        @param aBank the bank to which this ATM connects

     26     */

     27     public ATM(Bank aBank)

     28     {

     29        theBank = aBank;

     30        reset();

     31     }

     32

     33     /**

     34        Resets the ATM to the initial state.

     35     */

     36     public void reset()

     37     {

     38        customerNumber = -1;

     39        currentAccount = null;

     40        state = START;

     41     }

     42

     43     /**

     44        Sets the current customer number

     45        and sets state to PIN.

     46        (Precondition: state is START)

     47        @param number the customer number.

     48     */

     49     public void setCustomerNumber(int number)

     50     {

     51        customerNumber = number;

     52        state = PIN;

     53     }

     54

     55     /**

     56        Finds customer in bank.

     57        If found sets state to ACCOUNT, else to START.

     58        (Precondition: state is PIN)

     59        @param pin the PIN of the current customer

     60     */

     61     public void selectCustomer(int pin)

     62           throws SQLException

     63     {

     64        currentCustomer

     65              = theBank.findCustomer(customerNumber, pin);

     66        if (currentCustomer == null)

     67        {

     68           state = START;

     69        }

     70        else

     71        {

     72           state = ACCOUNT;

     73        }

     74     }

     75

     76     /**

     77        Sets current account to checking or savings. Sets

     78        state to TRANSACT.

     79        (Precondition: state is ACCOUNT or TRANSACT)

     80        @param account one of CHECKING or SAVINGS

     81     */

     82     public void selectAccount(int account)

     83     {

     84        if (account == CHECKING)

     85        {

     86           currentAccount = currentCustomer.getCheckingAccount();

     87        }

     88        else

     89        {

     90           currentAccount = currentCustomer.getSavingsAccount();

     91        }

     92        state = TRANSACT;

     93     }

     94

     95     /**

     96        Withdraws amount from current account.

     97        (Precondition: state is TRANSACT)

     98        @param value the amount to withdraw

     99     */

    100     public void withdraw(double value)

    101           throws SQLException

    102     {

    103        currentAccount.withdraw(value);

    104     }

    105

    106     /**

    107        Deposits amount to current account.

    108        (Precondition: state is TRANSACT)

    109        @param value the amount to deposit

    110     */

    111     public void deposit(double value)

    112           throws SQLException

    113     {

    114        currentAccount.deposit(value);

    115     }

    116

    117     /**

    118        Gets the balance of the current account.

    119        (Precondition: state is TRANSACT)

    120        @return the balance

    121     */

    122     public double getBalance()

    123           throws SQLException

    124     {

    125        return currentAccount.getBalance();

    126     }

    127

    128     /**

    129        Moves back to the previous state.

    130     */

    131     public void back()

    132     {

    133        if (state == TRANSACT)

    134        {

    135           state = ACCOUNT;

    136        }

    137        else if (state == ACCOUNT)

    138        {

    139           state = PIN;

    140        }

    141        else if (state == PIN)

    142        {

    143           state = START;

    144        }

    145     }

    146

    147     /**

    148        Gets the current state of this ATM.

    149        @return the current state

    150     */

    151     public int getState()

    152     {

    153        return state;

    154     }

    155  }